package cn.itcast.nems.studentrecord.service.studentrecord;


import cn.itcast.nems.studentrecord.dao.dataobject.StudentRecordFundFlowInfoDO;
import cn.itcast.nems.studentrecord.dao.dataobject.StudentRecordFundFlowSchoolChannelDO;
import cn.itcast.nems.studentrecord.dao.entity.StudentRecordFundFlow;
import cn.itcast.nems.studentrecord.dto.studentrecord.StudentRecordFundFlowDTO;
import cn.itcast.nems.studentrecord.dto.studentrecord.StudentRecordFundFlowInfoDTO;
import cn.itcast.nems.studentrecord.dto.studentrecord.StudentTotalRefundableAmountDTO;
import org.apache.ibatis.annotations.Param;

import java.util.Collection;
import java.util.List;

/**
 * <p>
 * 学籍资金流转明细;资金流：学籍上汇聚和所有凭单上的正反向的所有资金流水。比如报名订单、转班凭单、退费单等。注：有发生资金变化时纪录该表，但只在实际发生时再纪录！ 服务类
 * </p>
 *
 * @author liyong
 * @since 2023-11-14
 */
public interface StudentRecordFundFlowService {

    /**
     * <p>
     * 根据学籍ID和支付单号查询学籍流水
     * </p>
     *
     * @param studentRecordId 学籍ID
     * @param paymentNo 支付单号
     * @author zhouwei
     * @since 2024/4/10 10:38 AM
     **/
    StudentRecordFundFlow selectByStudentRecordIdPaymentNo(String studentRecordId, String paymentNo) ;

    /**
     * <p>
     * 根据学籍ID、凭单ID和凭单类型查询学籍流水
     * </p>
     *
     * @param studentRecordId 学籍ID
     * @param referenceId 凭单ID
     * @param referenceType  凭单类型
     * @author zhouwei
     * @since 2024/4/16 5:04 PM
     **/
    List<StudentRecordFundFlow> selectByStudentRecordIdAndReferenceIdAndReferenceType(String studentRecordId,String referenceId, String referenceType);

    /**
     * 添加支付流水
     *
     * @param studentRecordFundFlowDTO 支付信息
     * @return true 已支付完成，false 部分支付 null这笔支付已经处理过
     */
    Boolean create(StudentRecordFundFlowDTO studentRecordFundFlowDTO);

    Boolean create(StudentRecordFundFlowInfoDTO studentRecordFundFlowInfoDTO);

    /**
     * 根据凭单，判断转移从转出班转出的支付流水是否已经存在
     *
     * @param studentRecordId 学籍ID
     * @param referenceId     凭单/订单id
     * @param referenceLineId 凭单/订单行ID
     * @return 是否存在
     */
    boolean exsitReference(String studentRecordId, String referenceId, String referenceLineId);

    /**
     * 根据凭单，判断转移从转出班转出的支付流水是否已经存在
     *
     * @param studentRecordId 学籍ID
     * @param paymentNo       支付流水号
     * @return 凭单id
     */
    Long exsitPaymentNo(String studentRecordId, String paymentNo);


    /**
     * 功能描述: 学员信息查询-学籍信息-支付信息
     *
     * @param studentRecordId 学籍编号
     * @return
     * @author 陈早庆
     * @update:[变更日期2023年12月05日][更改人姓名][变更描述]
     * @since 2023年12月05日
     */
    List<StudentRecordFundFlowInfoDO> listStudentRecordFundFlowInfo(String studentRecordId);
    Boolean update(StudentRecordFundFlowDTO studentRecordFundFlow);

    List<StudentRecordFundFlowSchoolChannelDO> selectByStudentRecordIdClazzId(String studentRecordId, Integer clazzId);

    List<StudentRecordFundFlow> listStudentRecordFundFlows(Collection<String> recordIdList);
    
    /**
     * 
     * 功能描述：获取学生可退费的最大金额
     * <p/>
     * 学生实际支付总额 = SUM(在线支付) + SUM(离线支付)  <br/>
     * 学生实际退费总额 = SUM(退费) + SUM(退费退回)     <br/>
     * 学生可退费最大金额合计 = 学生实际支付总额 - ABS(学生实际退费总额) 
     * 
     *
     * @param studentId 学生ID
     * @return 学生实际支付总额、学生实际退费总额、学生可退费最大金额
     * 
     * @author 刘曙
     *
     * @since 2024年3月19日
     *
     * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
     */
    StudentTotalRefundableAmountDTO getStudentTotalRefundableAmountDTO(final Integer studentId);
}
